package com.ymx.darling.generater.def;

import java.util.ArrayList;
import java.util.List;

/**
 * 命名方式转换器
 * @author 爱Java的小于
 */
public class NamingConverter {

    /**
     * 根据命名风格转换字符串
     * @param input 原始字符串（假设单词已用空格或下划线分隔）
     * @param style 目标命名风格
     * @return 转换后的字符串
     */
    public static String convertNamingStyle(String input, NamingStyle style) {
        if (input == null || input.isEmpty()) {
            return input;
        }

        // 首先将输入字符串拆分为单词，识别驼峰命名、下划线、连字符等情况
        List<String> words = splitIntoWords(input);
        if (words.isEmpty()) {
            return input;
        }

        StringBuilder result = new StringBuilder();

        switch (style) {
            case UPPER_CASE:
                for (String word : words) {
                    if (result.length() > 0) result.append("_");
                    result.append(word.toUpperCase());
                }
                break;

            case LOWER_CASE:
                for (String word : words) {
                    if (result.length() > 0) result.append("_");
                    result.append(word.toLowerCase());
                }
                break;

            case CAMEL_CASE:
                result.append(words.get(0).toLowerCase());
                for (int i = 1; i < words.size(); i++) {
                    result.append(capitalize(words.get(i)));
                }
                break;
        }

        return result.toString();
    }

    // 将输入字符串拆分为单词列表（处理驼峰、下划线、连字符等情况）
    private static List<String> splitIntoWords(String input) {
        List<String> words = new ArrayList<>();

        // 先用下划线、连字符、空格分割
        String[] parts = input.split("[ _-]");

        for (String part : parts) {
            if (part.isEmpty()) continue;

            // 进一步处理驼峰命名部分
            int start = 0;
            for (int i = 1; i < part.length(); i++) {
                if (Character.isUpperCase(part.charAt(i))) {
                    words.add(part.substring(start, i).toLowerCase());
                    start = i;
                }
            }
            words.add(part.substring(start).toLowerCase());
        }

        return words;
    }

    // 首字母大写（辅助方法）
    private static String capitalize(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        return str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();
    }
}
